module	LCD_TEST (
// Host Side
 input iCLK,iRST_N,
 input [3:0] inLcdA,
 input [3:0] inLcdB,
 input [3:0] inLcdC,
 input [3:0] inLcdD,
 input [3:0] inLcdE,
 input [3:0] inLcdF,
 input [3:0] inLcdG,
 input [3:0] inLcdH,
 input [3:0] inLcdI,
 input [3:0] inLcdJ,
 input [3:0] inLcdK,
 input [3:0] inLcdL,
 input [3:0] inLcdM,
 input [3:0] inLcdN,
 input [3:0] inLcdO,
 input [3:0] inLcdP,
// LCD Side
 output [7:0] 	LCD_DATA,
 output LCD_RW,LCD_EN,LCD_RS	
);
//	Internal Wires/Registers
reg	[5:0]	LUT_INDEX;
reg	[8:0]	LUT_DATA;
reg	[5:0]	mLCD_ST;
reg	[24:0]	mDLY;
reg		mLCD_Start;
reg	[7:0]	mLCD_DATA;
reg		mLCD_RS;
wire		mLCD_Done;

parameter	LCD_INTIAL	=	0;
parameter	LCD_LINE1	=	5;
parameter	LCD_CH_LINE	=	LCD_LINE1+16;
parameter	LCD_LINE2	=	LCD_LINE1+16+1;
parameter	LUT_SIZE	=	LCD_LINE1+32+1;
//



//always@(posedge iCLK or negedge iRST_N)
//begin 
//	if(!iRST_N)
//		begin
//			LUT_INDEX <= 0;
//			mDLY <= 0;
//			mLCD_Start <= 0;
//			mLCD_DATA <=0;
//			mLCD_RS <= 0;
//		end	
//	else
//		begin 
//			mLCD_DATA <= LUT_DATA[7:0];
//			mLCD_RS <= LUT_DATA[8];
//			mLCD_Start <= 1;
//				if (mLCD_Done)
//					begin 
//						if(mDLY<25'h3FFFFF)
//							begin
//								mDLY	<=	mDLY + 1'b1;
//							end
//						else
//							begin
//								LUT_INDEX <= 6'd6;
//								mLCD_Start <= 0;
//								mDLY <= 0;
//							end
//					end
//		end			
//end




always@(posedge iCLK or negedge iRST_N)
begin
	if(!iRST_N)
	begin
		LUT_INDEX	<=	0;
		mLCD_ST		<=	0;
		mDLY		   <=	0;
		mLCD_Start	<=	0;
		mLCD_DATA	<=	0;
		mLCD_RS		<=	0;
	end
	else
	begin
		if(LUT_INDEX<LUT_SIZE)
		begin
			case(mLCD_ST)
			0:	begin
					mLCD_DATA	<=	LUT_DATA[7:0];
					mLCD_RS		<=	LUT_DATA[8];
					mLCD_Start	<=	1;
					mLCD_ST		<=	1;
				end
			1:	begin
					if(mLCD_Done)
					begin
						mLCD_Start	<=	0;
						mLCD_ST		<=	2;					
					end
				end
			2:	begin
					if(mDLY<25'h3FFFFE)//18'h3FFFE
					mDLY	<=	mDLY + 1'b1;
					else
					begin
						mDLY	<=	0;                       
						mLCD_ST	<=	3;
					end
				end                                           
			3:	begin
					LUT_INDEX	<=	LUT_INDEX + 1'b1;
					mLCD_ST	<=	0;
				end
			endcase
		end
		else 
			begin 
				LUT_INDEX <= 1'b0;///////////////////////////
			end	
	end
	
end
always @ (*)
	begin
				case(LUT_INDEX)
				//	Initial
				LCD_INTIAL+0:	LUT_DATA	<=	9'h038;
				LCD_INTIAL+1:	LUT_DATA	<=	9'h00C;
				LCD_INTIAL+2:	LUT_DATA	<=	9'h001;
				LCD_INTIAL+3:	LUT_DATA	<=	9'h006;
				LCD_INTIAL+4:	LUT_DATA	<=	9'h080;
				//	Line 1
				
				LCD_LINE1+0:			case(inLcdA)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
				
				
				LCD_LINE1+1:		case(inLcdB)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+2:	case(inLcdC)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+3:	case(inLcdD)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+4:	case(inLcdE)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase
													
				LCD_LINE1+5:	case(inLcdF)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase
													
				LCD_LINE1+6:	case(inLcdG)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase
													
				LCD_LINE1+7:	case(inLcdH)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+8:	case(inLcdI)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+9:	case(inLcdJ)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase
													
				LCD_LINE1+10:	case(inLcdK)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase
													
				LCD_LINE1+11:	case(inLcdL)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+12:	case(inLcdM)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase
													
				LCD_LINE1+13:	case(inLcdN)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+14:	case(inLcdO)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
													
				LCD_LINE1+15:	case(inLcdP)
														4'd0: LUT_DATA <= 9'h130;
														4'd1: LUT_DATA <= 9'h131;
														4'd2: LUT_DATA <= 9'h132;
														4'd3: LUT_DATA <= 9'h133;
														4'd4: LUT_DATA <= 9'h134;
														4'd5: LUT_DATA <= 9'h135;
														4'd6: LUT_DATA <= 9'h136;
														4'd7: LUT_DATA <= 9'h137;
														4'd8: LUT_DATA <= 9'h138;
														4'd9: LUT_DATA <= 9'h139;
														4'd10: LUT_DATA <= 9'h141;
														4'd11: LUT_DATA <= 9'h142;
														4'd12: LUT_DATA <= 9'h143;
														4'd12: LUT_DATA <= 9'h144;
														4'd14: LUT_DATA <= 9'h145;
														4'd15: LUT_DATA <= 9'h146;
													endcase	
				//	Change Line
				LCD_CH_LINE:	LUT_DATA	<=	9'h0C0;
				
				//	Line 2
				LCD_LINE2+0:	LUT_DATA	<=	9'h145;	//	Enter Your Input
				LCD_LINE2+1:	LUT_DATA	<=	9'h16E;
				LCD_LINE2+2:	LUT_DATA	<=	9'h174;
				LCD_LINE2+3:	LUT_DATA	<=	9'h165;
				LCD_LINE2+4:	LUT_DATA	<=	9'h172;
				LCD_LINE2+5:	LUT_DATA	<=	9'h120;
				LCD_LINE2+6:	LUT_DATA	<=	9'h159;
				LCD_LINE2+7:	LUT_DATA	<=	9'h16F;
				LCD_LINE2+8:	LUT_DATA	<=	9'h175;
				LCD_LINE2+9:	LUT_DATA	<=	9'h172;
				LCD_LINE2+10:	LUT_DATA	<=	9'h120;
				LCD_LINE2+11:	LUT_DATA	<=	9'h149;
				LCD_LINE2+12:	LUT_DATA	<=	9'h16E;
				LCD_LINE2+13:	LUT_DATA	<=	9'h170;
				LCD_LINE2+14:	LUT_DATA	<=	9'h175;
				LCD_LINE2+15:	LUT_DATA	<=	9'h174;
				default:		LUT_DATA	<=	9'dx ;
				endcase
			end
	
LCD_Controller u0(
//    Host Side
.iDATA(mLCD_DATA),
.iRS(mLCD_RS),
.iStart(mLCD_Start),
.oDone(mLCD_Done),
.iCLK(iCLK),
.iRST_N(iRST_N),
//    LCD Interface
.LCD_DATA(LCD_DATA),
.LCD_RW(LCD_RW),
.LCD_EN(LCD_EN),
.LCD_RS(LCD_RS)    );

endmodule